package com.hl.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*") //拦截所有路径  注册Filter
public class MyFilter implements Filter {

    //Filter的生命周期方法   从出生到销毁所经历的一系列过程，在一系列过程中会有一些方法表示过程中的某个结点操作，称之为生命周期方法

    //构建Filter对象时执行的方法，初始化方法，初始化数据，组件等操作
    //此方法只会在Filter对象构建时 执行一次 之后再也不执行了
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        System.out.println("Filter的init方法执行了");
    }

    //Filter的主体方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //敏感词过滤，登陆判断，跨域设置，统一编码
//        System.out.println("自定义多滤器执行");

        //请求的字符编码统一设置
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        request.setCharacterEncoding("utf-8");


        //跨域配置
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //设置允许哪些域，可以跨域访问当前的项目
        //      只要写 协议://主机地址:端口
        //      * ：允许所有域
        response.setHeader("Access-Control-Allow-Origin","*");
        //设置允许的请求方式
        response.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE");
        //设置允许的头信息
        response.setHeader("Access-Control-Allow-Headers","*");
        //设置支持传递cookie
        response.setHeader("Access-Control-Allow-Credentials","true");
        //预检请求的有效期，单位为秒
        response.setHeader("Access-Control-Max-Age","3600");

        //过滤器执行之后如果不放行，请求操作到此结束
        filterChain.doFilter(servletRequest, servletResponse);  //放行  可以接着访问Servlet
    }

    //当Filter对象销毁时执行的方法，释放资源数据
    //此方法只会在Filter对象销毁时 执行一次  之后再也不执行了
    @Override
    public void destroy() {
//        System.out.println("Filter的destroy方法执行了");
    }
}
